package com.culturalCenter.dataCenter.mapper.training;

import com.culturalCenter.dataCenter.customEntity.CustomServicedNumber;
import com.culturalCenter.dataCenter.customEntity.CustomServicedNumberList;
import com.culturalCenter.dataCenter.customEntity.ServicedNumber;
import com.culturalCenter.dataCenter.customEntity.responseParam.training.TrainingInfoDetailResponse;
import com.culturalCenter.dataCenter.customEntity.training.CustomParticipationRateRank;
import com.culturalCenter.dataCenter.customEntity.user.CustomListUser;
import com.culturalCenter.dataCenter.entity.training.Training;
import com.culturalCenter.dataCenter.mapper.base.BaseMapper;
import com.culturalCenter.dataCenter.param.ServiceVolumeParam;
import com.culturalCenter.dataCenter.param.TrainingClassParam;
import com.culturalCenter.dataCenter.vo.TrainingClassVo;
import com.culturalCenter.dataCenter.vo.TrainingDatartVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * 培训信息(Training)表数据库访问层
 *
 * @author makejava
 * @since 2020-09-22 19:24:37
 */
@Mapper
public interface TrainingMapper extends BaseMapper<Training> {

    /**
     * 通过ID查询单条数据
     *
     * @param id
     *         主键
     *
     * @return 实例对象
     */
    Training queryById(@Param("id") String id);

    /**
     * 查询指定行数据
     *
     * @param offset
     *         查询起始位置
     * @param limit
     *         查询条数
     *
     * @return 对象列表
     */
    List<Training> queryAllByLimit(@Param("offset") int offset, @Param("limit") int limit);

    /**
     * 分页查询所有数据
     *
     * @return 对象列表
     */
    List<Training> findPageAll();

    /**
     * 通过实体作为筛选条件查询
     *
     * @param training
     *         实例对象
     *
     * @return 对象列表
     */
    List<Training> queryAll(Training training);

    /**
     * 新增数据
     *
     * @param training
     *         实例对象
     *
     * @return 影响行数
     */
    int insert(Training training);

    /**
     * 选择列增加
     *
     * @param training
     *         实例对象
     *
     * @return 影响行数
     */
    int insertSelective(Training training);

    /**
     * 修改数据
     *
     * @param training
     *         实例对象
     *
     * @return 影响行数
     */
    int update(Training training);

    /**
     * 通过主键删除数据
     *
     * @param id
     *         主键
     *
     * @return 影响行数
     */
    int deleteById(@Param("id") String id);

    /**
     * 通过id查询时间轴
     *
     * @param refId
     *
     * @return
     */
    Training findTimeLine(@Param("refId") String refId);

    /**
     * 通过id查询课程创建人信息
     *
     * @param id
     *
     * @return
     */
    List<Training> findCreatorInfo(@Param("id") String id);

    /**
     * 查询培训课程信息
     *
     * @param trainingId
     *
     * @return
     */
    List<Training> queryByTrainingId(@Param("trainingId") String trainingId);

    /**
     * 查询项目下每个课程的全勤率
     *
     * @param trainingProjectId
     *
     * @return
     */
    List<Training> queryByProjectId(@Param("trainingProjectId") String trainingProjectId);

    /**
     * 获取课程基本信息
     *
     * @param trainingId
     *
     * @return
     */
    Training queryTrainingInfoById(@Param("trainingId") String trainingId);

    /**
     * 讲师
     *
     * @param trainingId
     *
     * @return
     */
    Training queryTeacherByTrainingId(@Param("trainingId") String trainingId);

    /**
     * 培训参与率排行
     *
     * @param branchId
     *
     * @return
     */
    List<CustomParticipationRateRank> getParticipationRateRank(@Param("startDate") String startDate,@Param("endDate") String endDate,@Param("branchId") String branchId);

    /**
     * 培训分类参与率排行
     * @param startDate
     * @param endDate
     * @param branchId
     * @return
     */
    List<CustomParticipationRateRank> getClassifyParticipationRateRank(@Param("startDate") String startDate,@Param("endDate") String endDate, @Param("branchId") String branchId);

    /**
     * 批量插入
     *
     * @param trainingList
     */
    void insertBatch(@Param("trainingList") List<Training> trainingList);

    /**
     * 今日推荐
     *
     * @param branchId
     *
     * @return 对象列表
     */
    List<Training> selectByDate(@Param("branchId") String branchId);

    /**
     * 获得面向人群
     *
     * @param branchId
     *
     * @return
     */
    List<String> getCrowd(@Param("branchId") String branchId, @Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 根据服务人群获得培训数
     *
     * @param crowd
     *
     * @return
     */
    Integer getNumByCrowd(@Param("branchId") String branchId, @Param("crowd") String crowd, @Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获得艺术分类
     *
     * @param branchId
     *
     * @return
     */
    List<String> getArt(@Param("branchId") String branchId, @Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 根据艺术分类获得培训数
     *
     * @param art
     *
     * @return
     */
    Integer getNumByArt(@Param("branchId") String branchId, @Param("art") String art, @Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 获得该馆该日的服务人数
     *
     * @param branchId
     * @param offsetDate
     *
     * @return
     */
    CustomServicedNumberList getServicedNumberList(@Param("branchId") String branchId, @Param("offsetDate") Date offsetDate);

    /**
     * 获得该馆日期范围内的服务人次统计
     *
     * @param branchId
     * @param startDay
     * @param endDay
     *
     * @return
     */
    CustomServicedNumber getServicedNumber(@Param("branchId") String branchId, @Param("startDay") Date startDay, @Param("endDay") Date endDay);

    /**
     * 获得该馆最早举办培训的日期
     *
     * @return
     */
    LocalDateTime getEarliestDate();

    /**
     * 查是否有服务人次数据
     *
     * @return
     */
    int countServicedNumber();

    /**
     * 得到场馆有场次的日期
     *
     * @return
     */
    List<ServicedNumber> getBranchDays(@Param("today") String today);

    /**
     * 根据branchId和date获取线下服务人次
     *
     * @param branchId
     * @param date
     *
     * @return
     */
    Integer getOfflineNumberByBranchAndDay(@Param("branchId") String branchId, @Param("date") String date);

    /**
     * 插入activityServedNumber
     *
     * @param asn
     *
     * @return
     */
    int insertTrainingServedNumber(ServicedNumber asn);

    /**
     * 获取培训分类列表
     *
     * @return
     */
    List<String> getTypes();

    /**
     * 获取该培训类型参与率最高的20个用户
     *
     * @param trainingType
     *
     * @return
     */
    List<CustomListUser> getUsersByTrainingType(String trainingType);

    TrainingInfoDetailResponse getTrainingInfoTableDetail(@Param("trainingId") String trainingId);

    List<TrainingDatartVo> getTrainingTable();

    /**
     * 获取本年/月/日培训班次数
     * @param branchId
     * @return
     */
    TrainingClassParam selectTrainingClassNum(@Param("branchId") String branchId);


    int getCourse(@Param("year") int year,@Param("month") int month);

    List<TrainingClassVo> selectMothTrainClassNum(String branchId);

    /**
     * 录入线上服务人数
     * @param param
     */
    void addServiceVolume(@Param("param") ServiceVolumeParam param);

    double getTrainingAvgParticipationRate(@Param("branchId") String branchId );

}
